package com.反射;


import lombok.AllArgsConstructor;

import java.lang.reflect.*;
import java.sql.SQLOutput;

/**
 * 获取class对象的三种方式
 *
 * @Author weijingchen
 * @Date 2025/6/27 20:55
 * @Version 1.0.0
 */
public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {

        // 方式一,最为常用
        Class<?> aClass = Class.forName("com.反射.User");
        //方式二，一般是当作参数传递的
        /*Class<User> userClass = User.class;

        //方式三
        //当我们已经有了这个类的对象才能使用
        User user = new User();
        Class<? extends User> aClass1 = user.getClass();


        System.out.println(aClass== userClass);// true

        System.out.println(aClass==aClass1);// true*/
        //获取构造方法
        //返回所有公共构造方法对象的数组
        Constructor<?>[] cons1 = aClass.getConstructors();
        for (Constructor<?> constructor : cons1) {
            System.out.println(constructor);
        }
        //返回所有构造方法对象的数组
        Constructor<?>[] cons2 = aClass.getDeclaredConstructors();
        for (Constructor<?> constructor : cons2) {
            System.out.println(constructor);
        }
        System.out.println("---------------------------------------------");
        // 获取无参构造方法对象
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
        System.out.println(declaredConstructor);
        //获取带参数的构造方法对象
        Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(String.class,int.class);
        System.out.println(declaredConstructor1);

        System.out.println("---------------------------------------------");
        int modifiers = declaredConstructor1.getModifiers();
        //判断构造方法是否为public
        System.out.println(Modifier.isPublic(modifiers));
        // 获取参数个数
        int parameterCount = declaredConstructor1.getParameterCount();
        System.out.println(parameterCount);
        // 获取参数类型
        Parameter[] parameters = declaredConstructor1.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        // 创建对象
        User user = (User) declaredConstructor1.newInstance("zhangsan", 18);
        System.out.println(user);
        System.out.println("-------------------成员变量--------------------------");
        // 获取成员变量
        //获取所有的成员变量
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println( field);
        }
       /*
       //private 私有成员变量无法通过此方法获取
        Field name1 = aClass.getField("name");
        System.out.println(name1);*/

        Field name = aClass.getDeclaredField("name");
        System.out.println(name);
        //获取修饰符
        int modifiers1 = name.getModifiers();
        System.out.println(Modifier.toString(modifiers1));
        //获取成员变量的名称
        String name1 = name.getName();
        System.out.println(name1);
        //获取成员变量的类型
        Class<?> type = name.getType();
        System.out.println(type);

        //获取成员变量的值
        User user1 = new User("zhangsan", 18);
        // 取消访问检查
        name.setAccessible( true);
        Object values = name.get(user1);
        System.out.println(values);
        name.set(user1, "lisi");
        System.out.println(user1);

    }
}
